package sustav.dekoderi;

public class DekoderKanala{


	char[][] matricaH;
	
	public DekoderKanala(){
		
		
		this.matricaH=new char[4][15];
		
	//Inicijaliziraj matricu H
		matricaH[0][0]='1';
		matricaH[0][2]='1';
		matricaH[0][4]='1';
		matricaH[0][5]='1';
		matricaH[0][6]='1';
		matricaH[0][10]='1';
		matricaH[0][12]='1';
		matricaH[0][14]='1';
		
		matricaH[1][1]='1';
		matricaH[1][2]='1';
		matricaH[1][5]='1';
		matricaH[1][6]='1';
		matricaH[1][9]='1';
		matricaH[1][10]='1';
		matricaH[1][13]='1';
		matricaH[1][14]='1';
		
		matricaH[2][3]='1';
		matricaH[2][4]='1';
		matricaH[2][5]='1';
		matricaH[2][6]='1';
		matricaH[2][11]='1';
		matricaH[2][12]='1';
		matricaH[2][13]='1';
		matricaH[2][14]='1';
		
		matricaH[3][7]='1';
		matricaH[3][8]='1';
		matricaH[3][9]='1';
		matricaH[3][10]='1';
		matricaH[3][11]='1';
		matricaH[3][12]='1';
		matricaH[3][13]='1';
		matricaH[3][14]='1';
		
	}

	
	/**
	 * Funkcija koja dekodira primljeni niz bitova.Ukoliko funkcija ne uspije
	 * ispravno dekodirati niz simbolavraca se -1 i prjenos staje.
	 * 
	 * @param zasticenaKodnaRjec
	 * @return
	 */
	public String dekodiraj(char[] zasticenaKodnaRjec){
		
		int sindrom=izracunajSindrom(zasticenaKodnaRjec);
		
		if(sindrom==0)
		{
			return dohvatiPodatak(zasticenaKodnaRjec);
		}
		else{
			if(zasticenaKodnaRjec[sindrom-1]=='1'){
				zasticenaKodnaRjec[sindrom-1]='0';
			}
			else{
				zasticenaKodnaRjec[sindrom-1]='1';
			}
			sindrom=izracunajSindrom(zasticenaKodnaRjec);
			if(sindrom==0){
				return dohvatiPodatak(zasticenaKodnaRjec);
			}
			else return null;
		}
		
	}
	
	
	/**
	 * 
	 * Vraca String s podatkom iz zasticene kodne rjeci
	 * @param zasticenaKodnaRjec
	 * @return
	 */
	private String dohvatiPodatak(char[] zasticenaKodnaRjec) {
		
		char[] podatak=new char[11];
		
		podatak[0]=zasticenaKodnaRjec[2];
		podatak[1]=zasticenaKodnaRjec[4];
		podatak[2]=zasticenaKodnaRjec[5];
		podatak[3]=zasticenaKodnaRjec[6];
		podatak[4]=zasticenaKodnaRjec[8];
		podatak[5]=zasticenaKodnaRjec[9];
		podatak[6]=zasticenaKodnaRjec[10];
		podatak[7]=zasticenaKodnaRjec[11];
		podatak[8]=zasticenaKodnaRjec[12];
		podatak[9]=zasticenaKodnaRjec[13];
		podatak[10]=zasticenaKodnaRjec[14];
		
		return String.valueOf(podatak);
	}


	/**
	 * Nalazi sindrom generirane poruke
	 * @param zasticenaKodnaRjec
	 * @return
	 */
	private int izracunajSindrom(char[] zasticenaKodnaRjec) {
		
		char[] binarniSindrom=new char[4];
		int sindrom=0;
		
		for(int i=0;i<4;i++){
			for(int j=0;j<zasticenaKodnaRjec.length;j++){
				int tmp1=0,tmp2=0;
				
				if(zasticenaKodnaRjec[j]=='1'){
					tmp1=1;
				}
				
				if(matricaH[i][j]=='1'){
					tmp2=1;
				}
				
				if(tmp1*tmp2==1){
					binarniSindrom[i]='1';
				}
			}
		}
		
		for(int i=3;i<=0;i--){
			if(binarniSindrom[i]=='1'){
				sindrom+=Math.pow(2, i);
			}
		}
		
		return sindrom;
	}
}
	